package org.langqiao.disruptor;

import java.nio.ByteBuffer;

import com.lmax.disruptor.RingBuffer;


public class LongEventProducer {
	private final RingBuffer<LongEvent> ringBuffer;
	
	public LongEventProducer(RingBuffer<LongEvent> ringBuffer){
		this.ringBuffer = ringBuffer;
	}
	
	//用来发布事件，每调用一次发布一次事件
	//他的参数会通过事件传递给消费者
	public void onData(ByteBuffer bb){
		
		//请求下一个事件序号
		long sequence = ringBuffer.next();
		try {
			//获取该序号对应的事件对象
			LongEvent event = ringBuffer.get(sequence);
			event.setValue(bb.getLong(0));
		} finally {
			//发布事件
			//最后的 ringBuffer.publish 方法必须包含在 finally 中以确保必须得到调用；如果某个请求的 sequence 未被提交，将会堵塞后续的发布操作或者其它的 producer。
			ringBuffer.publish(sequence);
		}
	}
}
